$$.Server.protect = function(){
	
	/// 获取客户端IP
	/// @return {String} IP
	this.getIp = function(){
		var proxy = $("HTTP_X_FORWARDED_FOR", "serv");
			ip = proxy && proxy.indexOf("unknown") != -1 ? proxy.split(/,;/g)[0] : $("REMOTE_ADDR", "serv");
			
		ip = ip.trim().substring(0, 15);
		return "::1" === ip ? "127.0.0.1" : ip;
	}
	
 	/**
 	 * 获取客户端的IP地址。
 	 * @return {}
 	 */
 	this.getIP = function(isParseInt){
	    var ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")();
	    // for 0.0.0.0
	    if (!ip || (ip && ip.length < 7)){
	    	 ip = Request.ServerVariables("REMOTE_ADDR")();
	    }
	    
	    // what does this line be used to?
//	    if (strIP.indexOf(",") > 7) strIP = strIP.substr(0, strIP.indexOf(","));
	    if(isParseInt){
        	ip = ip.split('.');
        	ip = Number(ip[0]) * 256 * 256 * 256 +
				 Number(ip[1]) * 256 * 256 +
				 Number(ip[2]) * 256 +
				 Number(ip[3]);
        }
	    return ip;
	}
	
	/**
	 * 请求是否同源，可支持防盗链
	 */
	this.theSameDomain = function(){
        var
         From_Url = Request.ServerVarIables("HTTP_REFERER")()
        ,Serv_Url = Request.ServerVarIables("SERVER_NAME")();
        
        if (MId(From_Url,8,len(Serv_Url)) != Serv_Url){
            Response.WrIte("该文件数据不完整或许已损坏.");
            Response.End();
		}
	}
}

;(function(){

	/*
	 *     
	 * if Session("FYCC_Session_1")>FYCC_(6) and minute(now())<>Session("FYCC_Session_2") then
	        Session("FYCC_Session_1")=1
	        Session("FYCC_Session_2")=minute(now())
	elseif Session("FYCC_Session_1")>FYCC_(4)-1 and minute(now())=Session("FYCC_Session_2") then
	    if FYCC_(8)<>0 and Session("FYCC_Session_1")>FYCC_(4)-1 then
	        Call FYCC_X()
	    end if
	    response.redirect FYCC_(5)
	    response.end
	elseif Session("FYCC_Session_1")>FYCC_(6) and minute(now())=Session("FYCC_Session_2") then
	    response.write "本站启动防刷新功能,1分钟内只能翻"&FYCC_(6)&"页,请在下一分钟再刷新本页面"
	    Session("FYCC_Session_1")=Session("FYCC_Session_1")+1
	    response.end
	else
	    if Session("FYCC_Session_1")="" then
	        Session("FYCC_Session_1")=1
	        Session("FYCC_Session_2")=minute(now())
	    else
	        if minute(now())<>Session("FYCC_Session_2") then
	            Session("FYCC_Session_1")=1
	            Session("FYCC_Session_2")=minute(now())
	        else
	            Session("FYCC_Session_1")=Session("FYCC_Session_1")+1
	        end if
	    end if
	End if
	 */
	function noQuickRefresh(){
	    // by Session?
	    var 
	         DoReflashPage = true
	        ,shuaxin_time  = 10
	        ,ReflashTime   = new Date;
	    
	    if (Session.Contents("ReflashTime") && shuaxin_time > 0 && DoReflashPage){
	        if(DateDiff("s", Session("ReflashTime"), new Date)){
	            Response.Write(" 本页面起用了防刷新机制，请不要在" + shuaxin_time + "秒内连续刷新本页面正在打开页面，请稍候……");
	            Response.end();        
	        }else{
	            Session.Contents("ReflashTime") = new Date;
	        }
	    }else{
	        Session.Contents("ReflashTime") = new Date;
	    }
	    // by Cookies?
	    if(DateDiff("s", Request.Cookies("oesun")("vitistime"), new Date) < 2){
	        var url = Request.ServerVariables("Http_REFERER");
	        Response.write("防刷新,两秒后自动跳转");
	        Response.end();
	    }
	    Response.Cookies("oesun")("vitistime") = new Date().getVarDate();
	}

    /**
     * 检测请求来源是否合法
     * 通过判定本地发起的请求来源，检查得知是否由外部连接进入网站的，防盗链需要这个判定，也可以防止被iframe。
     * 如果黑客攻击，一般是在他的机器，而不是网站的域名下。
     * 下列情况是从浏览器的地址栏正常取得Request.ServerVariables("HTTP_REFERER")：
		　　1) 直接用<a href="">
		　　2) 用Submit或<input type="image">提交的表单(POST或GET)
		　　3) 使用JAvaScript提交的表单(POST或GET)
		　　下面我们再看看Request.ServerVariables("HTTP_REFERER")不能正常取值的情况：
		　　1) 从收藏夹链接
		　　2) 单击主页或自定义的地址
		　　3) 在浏览器中直接输地址
		　　4) 使用JavaScript的Location.href或者是Location.replace()
		　　5) <%Response.Redirect%>
		　　6) <%Response.AddHeader%>或者是<mete http-equiv="refresh">转向
		　　7) 用XML加载地址
	 * @return {Boolean} true表示通过。
	 */
    function checkLocalPost(){
		var 
			// 来源地址
			 referrer = Request.ServerVariables("HTTP_REFERER")()
			// 服务器地址
			,httpPost = Request.ServerVariables("HTTP_HOST")(); 

		// 来源地址包含了服务器地址，证明来源是合法的请求
		return referrer && (referrer.indexOf(httpPost) != -1);
    }


	/**
	 * ---频率上限制---
	 * 判断来源提交的时间。如果在提交页停留的时间太短，比如20秒，一般只要是个人，他打字的时间都不必这个少。举例说明，在用户打开页面（如add.asp）的时候，我们记下这个时间，在form提交表单里增加一个隐藏对象，如：
	 * <input name="initDate" type="hidden" value="<%=new Date%>" />
	 * 然后，当用户写好留言评论后提交到具体处理页面（如addok.asp）的时候，我们获取当前时间，和add.asp里的这个intime1时间比较，如果这个时间差小于设定的时间，如20秒，则禁止留言，判断为机器。代码可这样写：
	 */   
	function checkFrequency(POST){
		if((new Date - POST.initDate) < 20){
		    var msg = '您的留言速度太快了吧，禁止留言！';
		    return false;
		}else{
			return true;
		}
	}

	/**
	 * ---数量上限制---
	 * 通过记录用户的cookies以及IP来限制同一用户发表留言的数量。
	 * 比如一天24小时内，只允许同一用户发表信息5条。通过以上的限制，人工发帖也得到了一定的限制。
	 * 上面的方法是基于cookies判断，当然用户可以通过浏览器清空COOKIES，但这样增加了他们发垃圾帖子的难度，提高了门槛。
	 * @todo 如何区分内网和外网
	 * @todo 现在是以Cookies为判定条件，如果用IP判断作为判断条件，会有用。
	 * 那有人说了，不能换个IP再发啊，是的，发帖机是可以换IP发布，但是，换一次IP，就意味着它要掉一次线，而一般发帖机是多线程的，它这样做其他进程也同样无法发布了。
	 * p.s这里不能再假手于客户端的cookies了，统一服务端来做！、
	 */
	function checkAmount(POST){
		var 
		     cookieKey    = Request.cookies("edk_postAmount")
		    ,maxDailyPOST = 5
		    ,tomorrow	  = new Date(2008, 11, 31);
		    
		if(!cookieKey()){
		    cookieKey = 1;
		    /*
		     * 当与 COM 对象、ActiveX® 对象或其他以 VT_DATE 格式接受和返回日期值的对象（例如 Visual Basic 和 VBScript）进行交互时，使用 getVarDate 方法。
		     * 实际格式取决于地区设置，不随 JScript 变化。
		     * thx to xujiwei!
		     */
		    cookieKey.expires = tomorrow.getVarDate();
		}else{
		    cookieKey ++;
		}
		if(cookieKey() > maxDailyPOST){
		    var msg = "今天留言次数超过限制，禁止留言！";
		    return false;
		}
		return true;
	}

    /**
	 * 是否支持代理
	 * 此项强烈建议当受到攻击的时才启动!!
	 * 有HTTP_X_FORWARDED_FOR内容时表明是代理的？
	 * @todo
	 * @return {Boolean}
	 */
	function allowProxyClient(){
		var r = Request.ServerVariables("REMOTE_ADDR");
		if(Request.ServerVariables("HTTP_X_FORWARDED_FOR").Count) {
		    return false; // 对不起，本站禁止代理IP访问!
		}
	}

	/**
	 * 检测客户端是否为离线浏览器。支持Teleport、WebZIP。
	 * @return {Boolean}
	 */
	function offlineDownload(){
		if(/Teleport|WebZIP/i.test(Request.Servervariables("HTTP_USER_AGENT")())){
			return {
				msg :'当前访问的客户端为离线下载器！'
			};
		}else{
			return true;
		}
	}
		
	var CoverntFactory = {
		/**
		 * 剥去所有HTML标签。for Brief
		 * @return {String} 剥去HTML标签后的文本
		 */
		stripAllTags : function() {
			return this.text.replace(/<\/?[^>]+>/gi, '');
		}
	
		/**
		 * 剥去属于跨域的那些标签，暂时有script和iframe，image除外。
		 * @return {String} 剥去script后的HTML标签
		 */
		,stripCrossSiteTag : function() {
			var text = this.text;
			return text.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, '').replace(/(?:<iframe.*?>)((\n|\r|.)*?)(?:<\/iframe>)/ig, '');
		}
	
		/**
		 * 检查URL，是否有脚本。
		 * @param {String} str
		 * @return {String}
		 */
		,checkURL : function(str) {
			str = str.replace(/document\.cookie/ig, "document cookie");
			str = str.replace(/document\.write/ig, "document write");
			str = str.replace(/javascript:/ig, "javascript ");
			str = str.replace(/jscript:/ig, "jscript ");
			str = str.replace(/vbscript:/ig, "vbscript ");
			return str;
		}
	}
	$$.security = function(){
		
	}
})();